package com.aisile.admin.service.impl;

import cn.hutool.core.util.DesensitizedUtil;
import cn.hutool.crypto.digest.BCrypt;
import com.aisile.admin.mapper.AdUserMapper;
import com.aisile.admin.service.AdLoginService;
import com.aisile.common.exception.CustomExceptionCatch;
import com.aisile.model.admin.dtos.AdUserDto;
import com.aisile.model.admin.pojos.AdUser;
import com.aisile.model.common.dtos.ResponseResult;
import com.aisile.model.common.enums.AdminHttpCodeEnum;
import com.aisile.model.user.pojos.ApUser;
import com.aisile.utils.common.AppJwtUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * @Auther:yry
 * @Date:2023/12/25 0025
 * @VERSON:1.0
 */
@Service
@SuppressWarnings("ALL")
public class AdLoginServiceImpl implements AdLoginService {

    @Autowired
    private AdUserMapper adUserMapper;

    @Override
    public ResponseResult login(AdUserDto dto) {
        if(dto == null){
            CustomExceptionCatch.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 判断用户名和密码
        if(StringUtils.isEmpty(dto.getName()) || StringUtils.isEmpty(dto.getPassword())){
            CustomExceptionCatch.catchAdmin(AdminHttpCodeEnum.PARAM_INVALID);
        }
        // 实现登录逻辑！ 1. 先查询用户名  然后根据用户信息中的密码和用户传递过来的面进行对比  bcrypt 方式
        AdUser adUser = adUserMapper.selectOne(Wrappers.<AdUser>lambdaQuery().eq(AdUser::getName,dto.getName()));
        if(adUser==null){
            CustomExceptionCatch.catchAdmin(AdminHttpCodeEnum.LOGIN_NAME_ERROR);
        }
        // 判断状态
        if(adUser.getStatus() != 9){
            CustomExceptionCatch.catchAdmin(AdminHttpCodeEnum.NO_OPERATOR_AUTH);
        }
        // 用户名可以，权限可以  看看密码是否可行？
        if(!BCrypt.checkpw(dto.getPassword(),adUser.getPassword())){
            CustomExceptionCatch.catchAdmin(AdminHttpCodeEnum.LOGIN_PASSWORD_ERROR);
        }
        // 登录成功！ 需要记录登录时间
        adUser.setLoginTime(new Date());
        adUserMapper.updateById(adUser);

        // 签发JWT令牌
        String token =  AppJwtUtil.getToken(adUser.getId().longValue());
        // 封装给前端（User  token）
        // 数据脱敏： 手机号脱敏  、密码欧敏等等
        adUser.setPhone(DesensitizedUtil.mobilePhone(adUser.getPhone()));
        adUser.setPassword("******");

        Map<String,Object> resultMap = new HashMap<>();
        resultMap.put("adUser",adUser);
        resultMap.put("token",token);
        return ResponseResult.okResult(resultMap);
    }
}
